-- 引脚定义
-- 引脚定义
DS18B20_PIN = 6 -- 温度1引脚
spi_id = 2 -- SPI的id  温度2引脚
cs = gpio.setup(7, 1) -- spi的CS引脚
cs2 = gpio.setup(6, 1) -- spi的CS引脚
HX711_SCKPIN = 5 -- 称重引脚
HX711_DTPIN = 4 -- 称重引脚
ADC_PIN = 0 -- ADC 压力传感器引脚
Flow_PIN = 1
Realy1_PIN = 12
Realy2_PIN = 13
Realy3_PIN = 8

-- 全局变量
Temp1 = 0 -- 温度1
Temp2 = 0 -- 温度2
Weight = 0 -- 重量
maopi = 0 -- 毛皮/去皮
Pressure = 0 -- 气压
Flow = 0 -- 流量
pulseCount = 0 -- 流量计脉冲数
RelaySta1 = false
RelaySta2 = false
RelaySta3 = false

gpio.setup(HX711_DTPIN, nil)
gpio.setup(HX711_SCKPIN, 0)

gpio.setup(Realy1_PIN, 0) -- 继电器1 --输出模式，默认关闭
gpio.setup(Realy2_PIN, 0) -- 继电器2 --输出模式，默认关闭
gpio.setup(Realy3_PIN, 0) -- 继电器2 --输出模式，默认关闭

-- 设置中断, 仅上升沿触发  根据手册计算得出每个脉冲为3.33毫升， 1升水为300个脉冲
gpio.setup(
    Flow_PIN, 
    function(val)
    pulseCount = pulseCount + 1
    log.info('pulseCount', pulseCount)
end, 
gpio.PULLUP, gpio.RISING
)--gpio.PULLUP时，短接GND和Flow_PIN，Flow_PIN相对于GND处于高位（拉高），触发中断执行function
--gpio.RISING时，短接3.3V和Flow_PIN，Flow_PIN相对于3.3V处于低位（拉低），触发中断执行function

-- -- 读取设备重量
function readWeight(_HX711_DTPIN, _HX711_SCKPIN)
    -- 使用HX711_DTPIN和device.ADSK_PIN来读取重量...
    local weight = 0 -- 这里是假的
    gpio.set(_HX711_SCKPIN, 0) -- 使能AD（PD_SCK 置低）
    weight = 0
    while gpio.get(_HX711_DTPIN) == 1 do
        -- AD转换未结束则等待，否则开始读取
        sys.wait(1)
        log.info('等待')
    end
    for i = 1, 24 do
        gpio.set(_HX711_SCKPIN, 1) -- PD_SCK 置高（发送脉冲）
        weight = weight << 1 -- 下降沿来时变量Count左移一位，右侧补零
        gpio.set(_HX711_SCKPIN, 0) -- PD_SCK 置低
        if gpio.get(_HX711_DTPIN) == 1 then
            weight = weight + 1
        end
    end
    gpio.set(_HX711_SCKPIN, 1) -- 第25个脉冲下降沿来时，转换数据
    -- 这里对Count进行异或操作，如果LuatOS不支持位操作，需要其他方式实现
    weight = weight ~ 0x800000
    gpio.set(_HX711_SCKPIN, 0)
    return weight
end

-- 获取重量
-- sensor.hx711(pin_date, pin_clk)
function getWeight(maopi)
    local W = readWeight(HX711_DTPIN, HX711_SCKPIN) - maopi
    _Weight = math.floor(W / 94)
    log.info('Weight', _Weight)
    return _Weight
end

-- 0-4095 转 0-10v
function map(value, in_min, in_max, out_min, out_max)
    return (value - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
end

-- 获取压力
function getPressure()
    if adc.open(ADC_PIN) then
        if adc.get(ADC_PIN) >= 5 then
            _adc = adc.get(ADC_PIN) - 5 -- 读ADC值
        end
        -- log.info("ADC", _adc)
        adcv = map(_adc, 0, 4095, 0, 10) ---- 0-4095 转 0-10v
        adcv = string.format("%.3f", adcv) -- 只保留3位小数
        Pressure = string.format("%.3f", adcv / 10 * 1.6)
        log.info("adcv", adcv, 'Pressure', Pressure)

    end
end
-- 操作继电器
function setRealy(pin, sta)
    if sta == "on" then
        if pin == Realy1_PIN then
            RelaySta1 = true
            gpio.set(Realy1_PIN, 1)
        elseif pin == Realy2_PIN then
            RelaySta2 = true
            gpio.set(Realy2_PIN, 1)
        --自加
        elseif pin == Realy3_PIN then
            RelaySta3 = true
            gpio.set(Realy3_PIN, 1)   
        end
    elseif sta == "off" then
        if pin == Realy1_PIN then
            RelaySta1 = false
            gpio.set(Realy1_PIN, 0)
        elseif pin == Realy2_PIN then
            RelaySta2 = false
            gpio.set(Realy2_PIN, 0)
        elseif pin == Realy3_PIN then
            RelaySta3 = false
            gpio.set(Realy3_PIN, 0)
        end
    end
end

